package com.hyhy.hycloud.commons.helper;

import java.text.DateFormat;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author lanpengfei
 * @date 2018/12/4
 */
public class HycloudDateFormat extends SimpleDateFormat implements DateFormatHelper {

    /**
     * HycloudDateFormat不能继承StdDateFormat，
     * 在注入ObjectMapper后，_force方法会判断instanceof StdDateFormat，
     * 将强制使用StdDateFormat的实现
     */
    private DateFormat dateFormat;

    public HycloudDateFormat() {
        super();
    }

    public HycloudDateFormat(DateFormat dateFormat) {
        super();
        this.dateFormat = dateFormat;
    }

    /**
     * 优先使用注入的StdDateFormat的实现
     * 最后使用父类SimpleDateFormat的实现
     */
    @Override
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos) {
        return dateFormat != null ? dateFormat.format(date, toAppendTo, pos) : super.format(date, toAppendTo, pos);
    }

    /**
     * 优先使用HycloudDateFormat自定义的实现
     * 其次使用注入的StdDateFormat的实现
     * 最后使用父类SimpleDateFormat的实现
     */
    @Override
    public Date parse(String source, ParsePosition pos) {
        DateFormat df = initDateFormat(source);
        if (df == null) {
            df = dateFormat;
        }
        return df != null ? df.parse(source, pos) : super.parse(source, pos);
    }

    @Override
    public Object clone() {
        HycloudDateFormat hycloudDateFormat = (HycloudDateFormat) super.clone();
        if (dateFormat != null) {
            hycloudDateFormat.dateFormat = (DateFormat) dateFormat.clone();
        }
        return hycloudDateFormat;
    }
}
